#include <stdio.h>
#include <stdlib.h>
#include <gtk/gtk.h>
#include <glib.h>

#ifndef STRUCTS_C
#define STRUCTS_C

char *tab[] = { "{ }", "if", "else if", "else" };	


struct argument_list{
	char *type_name;
	char *name;
	struct argument_list* next;
};

struct line_code {
	char *text;
	struct line_code* next;
};

struct block_code {
	int type; 
	char* exp;
	struct line_code* code;
	struct block_code* next;
	struct block_code* inner;
};

void print_tab(int i)
{
	int a = 0;
	for( ; a < i ; a++)
		printf("\t");

}

void block_print(struct block_code *pt_block, int i)
{
	if( pt_block == 0)
	{
		print_tab(i);
		printf("Brak bloku\n");
	}
	else
	{
		print_tab(i);

		printf("typ bloku: %d\n",pt_block->type);	
		
		if( pt_block->type == 2 || pt_block->type == 1)
		{
			print_tab(i);

			printf("Wyrażenie: %s\n",pt_block->exp);	
		}

		struct line_code *wsk2 = pt_block->code;

		if(wsk2 == 0)
		{
			print_tab(i);
			printf("\tBrak kodu\n");
		}
		else
		{
			while(wsk2)
			{
				print_tab(i);
				printf("\tLinia kodu: %s\n",wsk2->text);
				wsk2 = wsk2->next;
			}
		}

		i++;
		print_tab(i++);
		printf("Wewnetrzny blok:\n");
		block_print( pt_block->inner, i);
		print_tab(i- 1);
		printf("Następny blok:\n");
		i--;
		block_print( pt_block->next, i);
		i++;
	}
}
////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////
struct function_list {
	char* name; 			//Nazwa funkcji
	char* return_type;		//Nazwa zwracanego typu
	struct argument_list* arg_list; //Lista argumentów
	struct block_code* block;	//Kolejne bloki kodu
	
	struct function_list* next;	//wskaźnik do następnej funkcji
};

//globalna lista wszystkich funkcji
struct function_list *g_function_list;


void add_function(char* type, char *name, struct argument_list* arg_list, struct block_code *block)
{
	if( g_function_list == 0)
	{
		g_function_list = malloc(sizeof(struct function_list));

		g_function_list->name = name;
		g_function_list->arg_list = arg_list;
		g_function_list->block = block;
		g_function_list->return_type = type;

		g_function_list->next = 0;
	}
	else
	{
		struct function_list *temp = malloc(sizeof(struct function_list));

		temp->name = name;
		temp->arg_list = arg_list;
		temp->block = block;
		temp->next = g_function_list;
		temp->return_type = type;

		g_function_list = temp;
	}
}

////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////

int type_counter = 0;

struct type {
	int id;
	char*   name;
};

int g_types_size = 255;
struct type *g_types = 0;

int add_type(char *name)
{
	//TODO: check if exist type of specified name
	if( type_counter < g_types_size )
	{
		g_types[type_counter].id = type_counter;
		g_types[type_counter].name = strdup(name);
		return type_counter++;
	}
	else
		;
	//TODO: realocate array

}

////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////


#endif

